package pack01;

import java.io.*;

/**
 * @作者：JustOne
 * @时间：2022/5/10 - 8:50
 */
public class Demo13_用递归复制多级文件 {
    public static void main(String[] args) throws IOException {
        //用递归复制多级文件
        //准备工作：准备一个多级文件夹《我的图片》，里面有文件和文件夹，放到"D:/刘景景的测试文件夹"下，

        //指定原目录路径
        File youBox = new File("D:/刘景景的测试文件夹/你的图片");
        //指定新目录路径
        File myBox = new File("D:/刘景景的测试文件夹/我的图片文件夹");
        //创建新的目录路径。。//之前讲过：【mkdirs()】创建多层目录。如果存在就当什么都没有发生
        if( !myBox.exists()){
            myBox.mkdirs();
        }

        copyBox(youBox, myBox);
        System.out.println("-------over-------");

    }

    //复制指定的目录
    public static void copyBox(File youBox, File myBox) throws IOException {
        System.out.println("正在查看的目录是："+youBox.getName());
        File[] arr = youBox.listFiles();//获取其子项目
        for (int i = 0; i < arr.length; i++) {
            //如果是 文件，就调用copyApple(File file, File box)进行复制
            if(arr[i].isFile()){
                copyApple(arr[i],myBox);//复制指定的文件(要复制的文件，复制到哪里去)
            }else{
                //如果是 目录，就调用copyBox(File youBox, File myBox)进行复制
                //之前学过：在已知目录下创建目录。。。前提条件是这个目录存在
                //File file05 = new File("D:/myFile02","诗歌文件夹");
                //boolean e = file05.mkdir();

                //在新盒子中创建 当前盒子
                File mySubBox = new File(myBox, arr[i].getName());
                mySubBox.mkdirs();
                //递归。作用：把当前盒子 和 子盒子 传过去，因为当前盒子中可能还有下一级
                //这一句不是很好理解。
                copyBox(arr[i],mySubBox);
            }
        }
    }

    //复制指定的文件(要复制的文件，复制到哪里去)
    public static void copyApple(File youFile, File myBox) throws IOException {
        //学过：在指定目录下创建 文件
        File myFile = new File(myBox, youFile.getName());

        //以后也可以用IO流
        RandomAccessFile raf = new RandomAccessFile(youFile,"rw");//指定原件
        RandomAccessFile myRaf = new RandomAccessFile(myFile,"rw");//创建复印件
        byte[] data = new byte[1024];
        //读
        int len = -1;
        while( (len=raf.read(data)) != -1){
            myRaf.write(data,0,len);//写
        }

        System.out.println("复制完毕");

        raf.close();
        myRaf.close();
    }

}











